home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 3: Developer Tools / Linux Cubed Series 3 - Developer Tools.iso / devel / db / esm-3.1 / esm-3 / usr / local / sm / src / include / BTREEPAGE.h < prev    next >
Encoding:
C/C++ Source or Header  |  1996-05-05  |  15.1 KB  |  601 lines

  1. #ifndef __BTREEPAGE_H__
  2. #define __BTREEPAGE_H__
  3. /*
  4.  * $RCSfile: BTREEPAGE.h,v $
  5.  * $Revision: 1.1.1.1 $
  6.  * $Date: 1996/05/04 21:55:07 $
  7.  */
  8. /**********************************************************************
  9.  * EXODUS Database Toolkit Software
  10.  * Copyright (c) 1991 Computer Sciences Department, University of
  11.  *                    Wisconsin -- Madison
  12.  * All Rights Reserved.
  13.  *
  14.  * Permission to use, copy, modify and distribute this software and its
  15.  * documentation is hereby granted, provided that both the copyright
  16.  * notice and this permission notice appear in all copies of the
  17.  * software, derivative works or modified versions, and any portions
  18.  * thereof, and that both notices appear in supporting documentation.
  19.  *
  20.  * THE COMPUTER SCIENCES DEPARTMENT OF THE UNIVERSITY OF WISCONSIN --
  21.  * MADISON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" CONDITION.  
  22.  * THE DEPARTMENT DISCLAIMS ANY LIABILITY OF ANY KIND FOR ANY DAMAGES
  23.  * WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
  24.  *
  25.  * The EXODUS Project Group requests users of this software to return 
  26.  * any improvements or extensions that they make to:
  27.  *
  28.  *   EXODUS Project Group 
  29.  *     c/o David J. DeWitt and Michael J. Carey
  30.  *   Computer Sciences Department
  31.  *   University of Wisconsin -- Madison
  32.  *   Madison, WI 53706
  33.  *
  34.  *     or exodus@cs.wisc.edu
  35.  *
  36.  * In addition, the EXODUS Project Group requests that users grant the 
  37.  * Computer Sciences Department rights to redistribute these changes.
  38.  **********************************************************************/
  39.  
  40. #include <stdio.h>
  41. #include <stdlib.h>
  42.  
  43. #ifdef SERVER_MAKE
  44. #   include <sys/types.h>
  45. #   include <netinet/in.h>
  46. #   include <setjmp.h>
  47. #   include "sysdefs.h"
  48. #endif SERVER_MAKE
  49.  
  50. #include "ess.h"
  51. #include "checking.h"
  52. #include "trace.h"
  53. #include "error.h"
  54. #include "io.h"
  55. #include "list.h"
  56. #include "object.h"
  57. #include "tid.h"
  58. #include "lock.h"
  59.  
  60. #ifdef SERVER_MAKE
  61. #    include "msgdefs.h"
  62. #    include "thread.h"
  63. #    include "semaphore.h"
  64. #    include "latch.h"
  65. #    include "pool.h"
  66. #    include "link.h"
  67. #endif SERVER_MAKE
  68.  
  69. #include "bf.h"
  70.  
  71. #ifndef SERVER_MAKE
  72. #    include "chunk.h" 
  73. #    include "load.h"
  74. #    include "scan.h"
  75. #    include "sm_params.h"
  76. #    include "btree.h"
  77. #    include "sm_globals.h"
  78. #    include "sm_extfuncs.h"
  79. #    include "sm_state.h"
  80. #endif SERVER_MAKE
  81.  
  82. #include "bf_extfuncs.h"
  83. #include "bf_globals.h"
  84. #include "cc_macro.h"
  85. #include "volume.h"
  86. #include "lsn.h"
  87. #include "logrecs.h"
  88. #include "logaction.h"
  89. #include "trans.h"
  90. #ifndef SERVER_MAKE
  91. #    include "clog.h"
  92. #    include "clog_extfuncs.h"
  93. #    include "loginfo.h"
  94. #    include "clog_globals.h"
  95. #else
  96. #    include "trans_extfuncs.h"
  97. #    include "openlog.h"
  98. #    include "log.h"
  99. #    include "log_extfuncs.h"
  100. #    include "thread_globals.h"
  101. #    include "undo.h"
  102. #    include "undo_extfuncs.h"
  103. #    include "redo_extfuncs.h"
  104. #    include "log_globals.h"
  105. #endif SERVER_MAKE
  106.  
  107. #ifndef PFCDEFINED
  108. typedef int     (*PFC)(int kLen1, void* kVal1, int kLen2, void* kVal2);
  109. typedef void    (*PFK)(int kLen, char* kVal);
  110. #endif    /* PFCDEFINED */
  111.  
  112. #ifdef __ESS_H__
  113. #define ASSERT1(cond)    SM_ASSERT(LEVEL_1, cond)
  114. #define ASSERT2(cond)    SM_ASSERT(LEVEL_2, cond)
  115. #define ASSERT3(cond)    SM_ASSERT(LEVEL_3, cond)
  116. #endif
  117.  
  118.  
  119. #include "bt_extfuncs.h"
  120.  
  121. /*
  122.  *    Size of a BTREEPAGE defined in object.h
  123.  */
  124.  
  125. #ifdef __cplusplus            /* BTREEPAGE defs for C++ only */
  126.  
  127. const MAXINT = (1 << 31) - 1;
  128.  
  129. //
  130. // This should be an external function in BF layer.
  131. //
  132. extern "C" PAGEHASH* BF_FindHashEntry(PID*);
  133.  
  134.  
  135. //
  136. //    BT_TRACE macro
  137. //
  138. #ifdef BT_DEBUG
  139. #define BT_TRACE(x)    printf x
  140. #else
  141. #define BT_TRACE(x)
  142. #endif
  143.  
  144.  
  145. //
  146. //    Maximum # of levels
  147. //
  148. const MAXPARENTS = 10;
  149.  
  150. const EMPTYSLOT    = -1;
  151.  
  152.  
  153. enum BT_OPER  {
  154.     BT_READ = 1,
  155.     BT_INSERT = 2,
  156.     BT_DELETE = 4,
  157.     BT_INSERT_DELETE = 6
  158. };
  159.  
  160.  
  161. // 
  162. //    BTREE page control structure 
  163. //
  164. struct BTCONTROL { 
  165.     LRC        lrc;        // for recovery (MUST BE 1st FIELD (cheated))
  166.     PID        selfID;        // id of this page
  167.     TWO        endData;    // offset to end of the data section 
  168.     TWO        numOffsets;    // number of offsets 
  169.     TWO        numFree;    // number of free bytes 
  170.     UONE    level;        // leaf if 1, non-leaf if > 1
  171.     ONE        type;        // SMDATATYPE
  172.     SHORTPID     next;        // left sibling
  173.     SHORTPID     prev;        // right sibling
  174.     SHORTPID     pid0;        // first ptr in non-leaf nodes
  175.     FOUR    filler;        // for 8byte alignment
  176. };
  177.  
  178.  
  179. const BT_MAGIC = 14021967;
  180.  
  181. /*
  182.  *     BTREE page definition
  183.  */
  184. const BT_DATASIZE = BTREE_PAGESIZE - sizeof(BTCONTROL);
  185.  
  186. struct BT_Tuple;
  187.  
  188. typedef TWO SLOT;
  189.  
  190. class BTREEPAGE {
  191.     
  192.     // 
  193.     //    Physical undos and redos must access page directly
  194.     //    (special _fr functions are used to bypass a g++ bug)
  195.     //
  196.     friend void undoBtree_fr(LOGRECORDHDR*);
  197.     friend void redoBtree_fr(LOGRECORDHDR*);
  198.     
  199. protected:
  200.     
  201.     BTCONTROL    btCtrl;        // control information
  202.     char    data[BT_DATASIZE - sizeof(SLOT)];
  203.     SLOT    slot[1];    // first slot on page
  204.     
  205.     void Compress();
  206.     
  207. public:
  208.     /*
  209.      *    General queries
  210.      */
  211.     LRC&     lrc()        { return btCtrl.lrc; }
  212.     PID&    SelfID()    { return btCtrl.selfID; }
  213.     int        Level()        { return btCtrl.level; }
  214.     SHORTPID    NextPage()    { return btCtrl.next; }
  215.     SHORTPID    PrevPage()    { return btCtrl.prev; }
  216.     int        Volume()    { return btCtrl.selfID.volid; }
  217.     SHORTPID    FirstVector()    { return btCtrl.pid0; }
  218.     int        NumSlots()    { return btCtrl.numOffsets; }
  219.     int        IsLeaf()    { return btCtrl.level == 1; }
  220.     int        IsNode()    { return ! IsLeaf(); }
  221.     SMDATATYPE    KeyType()    { return (SMDATATYPE) btCtrl.type; }
  222.     IsSafe(BT_OPER oper, int maxKeyLen);
  223.     
  224.     /*
  225.      *    Space usage 
  226.      */
  227.     UsableSpace()    { 
  228.     return BT_DATASIZE - btCtrl.endData 
  229.         - (btCtrl.numOffsets * sizeof(slot[0]));
  230.     }
  231.     UsedSpace()        { return BT_DATASIZE - btCtrl.numFree; }
  232.     FreeSpace()        { return btCtrl.numFree; }
  233.     
  234.     /*
  235.      *    Modify internal states
  236.      */
  237.     void SetFirstVector(SHORTPID pid)    { btCtrl.pid0 = pid; }
  238.     void SetLevel(int level)        { btCtrl.level = level; }
  239.     void Linkup(BTREEPAGE* rightPage, BTREEPAGE* rightRightPage);
  240.     
  241.     /*
  242.      *    Return a reference to tuple in slot sNum
  243.      */
  244.     BT_Tuple& Tuple(int sNum);
  245.     
  246.     /*
  247.      *    Add/Remove an element to/from slot sNum
  248.      */
  249.     AddElem(int sNum, const void* elem);
  250.     RemoveElem(int sNum, const void* elem);
  251.  
  252.     /*
  253.      *    Search for keyVal and, if found, return the slot in retSlot.
  254.      *    Returns TRUE if found, FALSE otherwise.
  255.      */
  256.     Search(int keyLen, const void* keyVal, PFC compFunc, TWO& retSlot);
  257.     
  258.     /*
  259.      *    Insert/Remove a tuple into/from slot "slotNum"
  260.      */
  261.     void AppendTuple(BT_Tuple& tuple)     {
  262.     InsertTuple(tuple, NumSlots());
  263.     }
  264.     void InsertTuple(BT_Tuple& tuple, int slotNum);
  265.     
  266.     void RemoveTuple(int slotNum);
  267.     
  268.     /*
  269.      *    Move numTuples starting at slotNum to destSlot in destPage
  270.      */
  271.     void ShiftTuple(int slotNum, BTREEPAGE* destPage, 
  272.             int destSlot, int numTuples);
  273.     
  274.     /*
  275.      *    Set tuple to overflow (reclaim space used by oidList)
  276.      */
  277.     void SetOverflow(int slotNum, const PID& ovPid);
  278.     
  279.     /*
  280.      *    Set tuple to underflow (reinsert oidList)
  281.      */
  282.     void SetUnderflow(int slotNum, int oidCnt, const void* elList);
  283.     
  284.     //
  285.     //    Copy data and data usage indicators to target page
  286.     //
  287.     void CopyData(BTREEPAGE* target);
  288.     
  289.     //
  290.     //    Initialize a new page
  291.     //
  292.     void Init(const PID& pid, int level, SMDATATYPE keyType);
  293.     
  294.     //
  295.     //    Debugging utilities
  296.     //
  297.     CheckContent();
  298.     
  299.     void
  300.     Print(BUFGROUP* bufGroup);
  301. };
  302.  
  303. #if (defined DEBUG && defined btree_MODULE) || ! defined DEBUG
  304.  
  305. INLINE BT_Tuple& BTREEPAGE::Tuple(int sNum)
  306.     return *((BT_Tuple*)(data+slot[-sNum])); 
  307. }
  308.  
  309. #endif /* (DEBUG && btree_MODULE) || !DEBUG */
  310.  
  311.  
  312. class ParentStack;
  313. class SMOPages;
  314. class OVPAGE;
  315.  
  316. class LHINDPAGE;
  317. class LHDIRPAGE;
  318.  
  319. //
  320. // REMEMBER: change GetPage() to call appropriate bf_ routine when it
  321. //     is available. GetPage() should allocate a page in the buffer
  322. //     without reading it from the server. It is called when the
  323. //     program needs a page right after allocating it.
  324. //
  325. struct PageDesc {
  326.     GROUPLINK*     gLink;
  327.     
  328.     //
  329.     //    Implicit conversion operators
  330.     //
  331.     operator BTREEPAGE*()    { 
  332.     return (gLink) ? (BTREEPAGE*) gLink->bufFrame : 0;
  333.     }
  334.     operator OVPAGE*()        {
  335.     return (gLink) ? (OVPAGE*) gLink->bufFrame : 0;
  336.     }
  337.     operator LHINDPAGE*()   {
  338.     return (gLink) ? (LHINDPAGE*) gLink->bufFrame : 0;
  339.     }
  340.     operator LHDIRPAGE*()   {
  341.     return (gLink) ? (LHDIRPAGE*) gLink->bufFrame : 0; 
  342.     }
  343.     
  344.     operator GROUPLINK*()    { return gLink; }
  345.     operator PAGEHASH*()    { return gLink->pageHash; }
  346.     operator ==(PageDesc& pd)     { return pd.gLink == gLink; }
  347.     
  348.     int  Read(BUFGROUP* bfg, const PID& pid, LOCKMODE lockMode);
  349.     int     GetPage(BUFGROUP* bfg, const PID& pid);
  350.     void Force();
  351.     void Dirty();
  352.     void Unfix();
  353.     void UnfixDirty();
  354.     void UnfixUnlock();
  355.     void UnfixUnlockDirty();
  356.     PageDesc()                { gLink = 0; }
  357.     ~PageDesc()                { };
  358. };
  359.  
  360.  
  361.  
  362. #ifdef SERVER_MAKE
  363. inline int PageDesc::Read(BUFGROUP* bfg, const PID& pid, LOCKMODE )
  364. {
  365.     SM_ASSERT(LEVEL_1, (gLink == 0));
  366.     gLink = bf_ReadPage(bfg, &pid, BTREE_PAGE2SIZE, NOFLAGS);
  367.     return (gLink) ? esmNOERROR : esmFAILURE;
  368. }
  369.  
  370. inline int PageDesc::GetPage(BUFGROUP* bfg, const PID& pid)    
  371. {
  372.     // really read the page, do not use the NOREAD flag
  373.     SM_ASSERT(LEVEL_1, (gLink == 0));
  374.     gLink = bf_ReadPage(bfg, &pid, BTREE_PAGE2SIZE, NOFLAGS);
  375.     return (gLink) ? esmNOERROR : esmFAILURE;
  376. }
  377. inline void PageDesc::Force()
  378. }
  379. inline void PageDesc::Dirty()
  380.     DIRTY_PAGE(gLink->pageHash);
  381. }
  382. inline void PageDesc::Unfix()
  383.     SM_ASSERT(LEVEL_1, gLink != 0);
  384.     bf_UnfixPage(gLink, BF_DEFAULT, FALSE); 
  385.     gLink = 0; 
  386. }
  387. inline void PageDesc::UnfixDirty()
  388.     SM_ASSERT(LEVEL_1, gLink != 0);
  389.     bf_UnfixPage(gLink, BF_DEFAULT, TRUE); 
  390.     gLink = 0; 
  391. }
  392. inline void PageDesc::UnfixUnlock()
  393.     Unfix();
  394. }
  395. inline void PageDesc::UnfixUnlockDirty()
  396. {
  397.     UnfixDirty();
  398. }
  399.  
  400. #else
  401. inline int PageDesc::Read(BUFGROUP* bfg, const PID& pid, LOCKMODE lockMode)
  402. {
  403.  
  404.     SM_ASSERT(LEVEL_1, (gLink == 0));
  405.     gLink = bf_ReadPage(bfg, &pid, H_INDEX, BTREE_PAGE2SIZE, lockMode);
  406.     return (gLink) ? esmNOERROR : esmFAILURE;
  407. }
  408.  
  409. inline int PageDesc::GetPage(BUFGROUP* bfg, const PID& pid)
  410. {
  411.     SM_ASSERT(LEVEL_1, (gLink == 0));
  412.     gLink = bf_FakeReadPage(bfg, &pid, H_INDEX, BTREE_PAGE2SIZE);
  413.     return (gLink) ? esmNOERROR : esmFAILURE;
  414. }
  415.  
  416. inline void PageDesc::Force()
  417.     bf_ForcePage(gLink->pageHash, NOFLAGS); 
  418. }
  419. inline void PageDesc::Dirty()
  420.     bf_DirtyPage(gLink->pageHash); 
  421. }
  422. inline void PageDesc::Unfix()
  423.     SM_ASSERT(LEVEL_1, gLink != 0);
  424.     bf_UnfixPage(gLink, BF_LRU, FALSE); 
  425.     gLink = 0; 
  426. }
  427. inline void PageDesc::UnfixDirty()
  428. {
  429.     SM_ASSERT(LEVEL_1, gLink != 0);
  430.     bf_UnfixPage(gLink, BF_LRU, TRUE); 
  431.     gLink = 0;
  432. }
  433. inline void PageDesc::UnfixUnlock()
  434.     SM_ASSERT(LEVEL_1, gLink != 0);
  435.     bf_UnfixUnlockPage(gLink, BF_LRU, FALSE); 
  436.     gLink = 0;
  437. }
  438. inline void PageDesc::UnfixUnlockDirty()
  439. {
  440.     SM_ASSERT(LEVEL_1, gLink != 0);
  441.     bf_UnfixUnlockPage(gLink, BF_LRU, TRUE); 
  442.     gLink = 0;
  443. }
  444.  
  445. #endif
  446.  
  447.  
  448. #include "BT_Tuple.h"
  449.  
  450.  
  451. #ifndef SERVER_MAKE
  452. extern BOOL btLogActive;    // true if log should be generated
  453. extern BOOL btCLRLogActive;    // true if CLR log should be generated during SMO
  454. #endif
  455.  
  456. extern "C"  {
  457.     extern int BT_AllocPage(
  458.     TID tid, int volume, BUFGROUP* bufGroup,
  459.     PID& returnPid, TWO level, SMDATATYPE keyType);
  460.     extern int BT_Traverse(
  461.     const PID& rootPid, int keyLen, const void* keyVal, 
  462.     int& found, TWO& returnSlot, ParentStack& pl,
  463.     BT_OPER oper, int maxKeyLen, PFC compFunc);
  464.     extern int BT_SplitPage(
  465.     TID tid, BUFGROUP* bufGroup, SMOPages* smo, 
  466.     ParentStack& pl, TWO slot,
  467.     int length, PageDesc& rightLink);
  468.     extern int BT_NewNodeTuple(
  469.     TID tid, BUFGROUP* bufGroup, SMOPages* smo,
  470.     ParentStack& pl, TWO klen,
  471.     void* key, PID* subtreePid, PFC compFunc);
  472.     extern int BT_ShiftTuples(
  473.     BTREEPAGE* srcPage, int srcSlot,
  474.     BTREEPAGE* destPage, int destSlot, 
  475.     int numTuples);
  476.     extern int BT_SearchElemArray(
  477.     int elSize, const void* el, int elCnt, 
  478.     const char* elArray, int& idx);
  479.     
  480.     extern int BT_LastEntry(
  481.     const PID& rootPID, int& found, 
  482.     TWO& slot, ParentStack& pl);
  483.     extern int BT_FirstEntry(
  484.     const PID& rootPID, int& found,
  485.     TWO& slot, ParentStack& pl);
  486.     
  487.     extern int BT_DecrElCnt(
  488.     TID tid, const PID& rootPid, BUFGROUP* bufGroup,
  489.     void* key, int keyLen, int maxKeyLen, 
  490.     PFC compFunc, LSNOFFSET undoNxtLSN);
  491.     extern int BT_IncrElCnt(
  492.     TID tid, const PID& rootPid, BUFGROUP* bufGroup,
  493.     void* key, int keyLen, int maxKeyLen, 
  494.     PFC compFunc, LSNOFFSET undoNxtLSN);
  495.     extern int BT_SetOverflow(
  496.     TID tid, const PID& rootPid, 
  497.     BUFGROUP* bufGroup, void* key, int keyLen, 
  498.     int maxKeyLen, PFC compFunc, const void* elList, 
  499.     int numOid, LSNOFFSET undoNxtLSN);
  500.     extern int BT_ResetOverflow(
  501.     TID tid, const PID& rootPid, 
  502.     BUFGROUP* bufGroup, void* key, int keyLen, 
  503.     int maxKeyLen, PFC compFunc, 
  504.     const void* elList, 
  505.     int numOid, LSNOFFSET undoNxtLSN);
  506.     
  507.     extern int BT_SetCLR(TID tid);
  508.     extern int BT_SetAnchor(TID tid);
  509.     extern int BT_ElemDiff(int sz, const void* e1, const void* e2);
  510.     
  511.     extern void BT_LogPageInit(PAGEHASH* pHash,TWO level, SMDATATYPE keyType);
  512.     extern void BT_LogModifyLink(
  513.     PID&, PAGEHASH* pHash, LRC&,
  514.     SHORTPID oldNext, SHORTPID newNext,
  515.     SHORTPID oldPrev, SHORTPID newPrev, 
  516.     LSNOFFSET undoNxtLSN);
  517.     extern void BT_LogModifyVector0(
  518.     PID&, PAGEHASH*, LRC&, SHORTPID oldPid0, 
  519.     SHORTPID newPid0, LSNOFFSET undoNxtLSN);
  520.     extern void BT_LogModifyLevel(
  521.     PID&, PAGEHASH*, LRC&, TWO oldLevel, 
  522.     TWO newLevel, LSNOFFSET undoNxtLSN); 
  523.     extern void BT_LogLogicInsert(
  524.     PID&, PAGEHASH*, LRC&, const PID& rootPid, 
  525.     const void* key, TWO keyLen, 
  526.     const void* el, TWO elSize,
  527.     TWO maxKeyLen, TWO unique, 
  528.     SMDATATYPE keyType,
  529.     LSNOFFSET undoNxtLSN);
  530.     extern void BT_LogLogicDelete(
  531.     PID&, PAGEHASH*, LRC&, const PID& rootPid, 
  532.     const void* key, 
  533.     TWO keyLen, const void* el, TWO elSize,
  534.     TWO maxKeyLen, TWO unique, SMDATATYPE keyType,
  535.     LSNOFFSET undoNxtLSN);
  536.     extern void BT_LogLogicSetOverflow(
  537.     PID&, PAGEHASH*, LRC&, 
  538.     const PID& rootPid, 
  539.     const void* key, TWO keyLen, TWO maxKeyLen,
  540.     SMDATATYPE keyType, int numEl, int elSize,
  541.     const void* elList, const PID& ovRoot,
  542.     LSNOFFSET undoNxtLSN);
  543.     extern void BT_LogLogicResetOverflow(
  544.     PID&, PAGEHASH*, LRC&, 
  545.     const PID& rootPid, 
  546.     const void* key, TWO keyLen, TWO maxKeyLen,
  547.     SMDATATYPE keyType, int numEl, int elSize,
  548.     const void* elList, const PID& ovRoot,
  549.     LSNOFFSET undoNxtLSN);
  550.     extern void BT_LogLogicIncrElCnt(
  551.     PID&, PAGEHASH*, LRC&, 
  552.     const PID& rootPid, 
  553.     const void* key, TWO keyLen, TWO maxKeyLen,
  554.     SMDATATYPE keyType, LSNOFFSET undoNxtLSN);
  555.     extern void BT_LogLogicDecrElCnt(
  556.     PID&, PAGEHASH*, LRC&, 
  557.     const PID& rootPid, 
  558.     const void*key, TWO keyLen, TWO maxKeyLen,
  559.     SMDATATYPE keyType, LSNOFFSET undoNxtLSN);
  560.  
  561.  
  562. #ifdef SERVER_MAKE
  563.     extern void BT_LogPureCLR(LSNOFFSET);
  564. #endif
  565. }
  566.  
  567. extern void BT_LogPhysicInsert(
  568.     PID&, PAGEHASH*, LRC&,
  569.     TWO slotNum, TWO numSlot, LSNOFFSET undoNxtLSN);
  570. extern void BT_LogPhysicDelete(
  571.     PID&, PAGEHASH*, LRC&, 
  572.     TWO slotNum, TWO numSlot, LSNOFFSET undoNxtLSN);
  573.  
  574. #ifdef SERVER_MAKE
  575. extern void BT_LogPhysicInsert(
  576.     PID&, PAGEHASH*, LRC&, TWO slotNum, 
  577.     TWO numSlot, int length, void* p, LSNOFFSET undoNxtLSN);
  578. extern void BT_LogPhysicDelete(
  579.     PID&, PAGEHASH*, LRC&, TWO slotNum, 
  580.     TWO numSlot, int length, void* p, LSNOFFSET undoNxtLSN);
  581. #endif
  582.  
  583. #include "LHINDPAGE.h"
  584. #include "LHDIRPAGE.h"
  585.  
  586. #endif        /* #ifdef C++ */
  587.  
  588. #endif __BTREEPAGE_H__
  589.  
  590.  
  591.